package com.heima.wemedia.job;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.heima.api.client.ArticleClient;
import com.heima.api.dto.ArticleDto;
import com.heima.common.contants.WmNewsConstants;
import com.heima.model.wemedia.pojo.WmNews;
import com.heima.wemedia.mapper.WmNewsMapper;
import com.heima.wemedia.service.WmNewsService;
import com.heima.wemedia.service.impl.WmNewsServiceImpl;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import io.seata.spring.annotation.GlobalTransactional;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * XxlJob开发示例（Bean模式）
 *
 * 开发步骤：
 *      1、任务开发：在Spring Bean实例中，开发Job方法；
 *      2、注解配置：为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称", init = "JobHandler初始化方法", destroy = "JobHandler销毁方法")"，注解value值对应的是调度中心新建任务的JobHandler属性的值。
 *      3、执行日志：需要通过 "XxlJobHelper.log" 打印执行日志；
 *      4、任务结果：默认任务结果为 "成功" 状态，不需要主动设置；如有诉求，比如设置任务结果为失败，可以通过 "XxlJobHelper.handleFail/handleSuccess" 自主设置任务结果；
 *
 * @author xuxueli 2019-12-11 21:52:51
 */
@Component// 作用为Bean
@Slf4j
public class WmNewsAutoPublishHandler {
    @Autowired
    private WmNewsService wmNewsService;
    @Autowired
    private WmNewsServiceImpl wmNewsServiceImpl;
    @Autowired
    private WmNewsMapper wmNewsMapper;
    @Autowired
    private ArticleClient articleClient;
    /**
     * 1、简单任务示例（Bean模式）
     */
    @XxlJob("demoJobHandler")
    public void demoTask(){
        log.info("每15秒钟扫描一次待发布、且发布时间已到的文章");
        //获取参数
        String jobParam = XxlJobHelper.getJobParam();
        log.info("任务调度参数:{}",jobParam);
    }

    @XxlJob("isTimeOutJobHandler")
    @GlobalTransactional
    public void isTimeOut(){
        log.info("===========================正在监测审核");
        // 查询数据库中待发布且发布时间已到的文章
        WmNews wmNews = wmNewsService.getOne(Wrappers.<WmNews>lambdaQuery().lt(WmNews::getPublishTime, new Date()).eq(WmNews::getStatus,4));
        wmNews.setStatus(WmNewsConstants.WM_NEWS_STATUS_PUBLISHED);
        if (ObjectUtil.isNotEmpty(wmNews)) {
            ArticleDto dto = wmNewsServiceImpl.isGrounding(wmNews);
            if (ObjectUtil.isNotEmpty(dto)){
                // 远程调用
                articleClient.saveArticle(dto);
            }
            log.info("===========================延时任务处理一次");
        }
        // 更新新闻对象
        wmNewsMapper.updateById(wmNews);
    }
}
